结构体定义和使用

概述

在 Swift 中,结构体(Struct)是一种自定义的数据类型,用于封装一组相关的属性和方法。结构体是值类型,这意味着当你将一个结构体实例赋值给另一个变量或常量时,会创建一个新的副本。结构体非常适合用于表示轻量级的数据结构,如坐标、尺寸、颜色等。

结构体的定义

语法

结构体的定义使用 struct 关键字,后跟结构体的名称和一对大括号 {}。在大括号内,你可以定义结构体的属性和方法。

struct 结构体名称 {
    // 属性定义
    var 属性1: 类型
    var 属性2: 类型
    // 方法定义
    func 方法名称() {
        // 方法实现
    }
}

示例

假设我们要定义一个表示二维平面上的点的结构体 Point,它有两个属性 x 和 y,分别表示点的横坐标和纵坐标。

struct Point {
    var x: Double
    var y: Double
}

结构体的实例化

语法

要创建一个结构体的实例,只需使用结构体的名称,并提供属性的初始值。

let 实例名称 = 结构体名称(属性1: 值1, 属性2: 值2)

示例

我们可以创建一个 Point 结构体的实例,表示点 (3.0, 4.0)。

let origin = Point(x: 3.0, y: 4.0)

访问结构体的属性

语法

要访问结构体实例的属性,使用点语法 .。

实例名称.属性名称

示例

我们可以访问 origin 实例的 x 和 y 属性。

print("x: \(origin.x), y: \(origin.y)")  // 输出: x: 3.0, y: 4.0

结构体的方法

语法

结构体可以包含方法,方法可以访问和修改结构体的属性。

struct 结构体名称 {
    var 属性1: 类型
    var 属性2: 类型
    
    func 方法名称() {
        // 方法实现
    }
}

示例

我们可以为 Point 结构体添加一个方法 distance,用于计算该点到原点 (0, 0) 的距离。

struct Point {
    var x: Double
    var y: Double
    
    func distance() -> Double {
        return sqrt(x * x + y * y)
    }
}

let origin = Point(x: 3.0, y: 4.0)
print("Distance to origin: \(origin.distance())")  // 输出: Distance to origin: 5.0

结构体的初始化器

语法

结构体默认会生成一个成员初始化器(Memberwise Initializer),允许你为所有属性提供初始值。你也可以自定义初始化器。

struct 结构体名称 {
    var 属性1: 类型
    var 属性2: 类型
    
    init(属性1: 类型, 属性2: 类型) {
        self.属性1 = 属性1
        self.属性2 = 属性2
    }
}

示例

我们可以为 Point 结构体添加一个自定义初始化器,允许我们只提供 x 坐标,y 坐标默认为 0。

struct Point {
    var x: Double
    var y: Double
    
    init(x: Double, y: Double = 0.0) {
        self.x = x
        self.y = y
    }
    
    func distance() -> Double {
        return sqrt(x * x + y * y)
    }
}

let point1 = Point(x: 3.0)
print("Point1: x: \(point1.x), y: \(point1.y)")  // 输出: Point1: x: 3.0, y: 0.0

let point2 = Point(x: 3.0, y: 4.0)
print("Point2: x: \(point2.x), y: \(point2.y)")  // 输出: Point2: x: 3.0, y: 4.0

实践练习

练习1:定义一个表示矩形的结构体

定义一个名为 Rectangle 的结构体,包含两个属性 width 和 height,表示矩形的宽度和高度。添加一个方法 area,用于计算矩形的面积。

struct Rectangle {
    var width: Double
    var height: Double
    
    func area() -> Double {
        return width * height
    }
}

let rect = Rectangle(width: 10.0, height: 5.0)
print("Rectangle area: \(rect.area())")  // 输出: Rectangle area: 50.0

练习2:定义一个表示日期的结构体

定义一个名为 Date 的结构体,包含三个属性 year、month 和 day,表示日期的年、月、日。添加一个方法 isLeapYear,用于判断该日期是否在闰年。

struct Date {
    var year: Int
    var month: Int
    var day: Int
    
    func isLeapYear() -> Bool {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
    }
}

let date = Date(year: 2024, month: 2, day: 29)
print("Is leap year: \(date.isLeapYear())")  // 输出: Is leap year: true

总结

结构体是 Swift 中一种强大的数据类型,用于封装一组相关的属性和方法。通过定义结构体,你可以创建自定义的数据类型,并使用它们来表示复杂的数据结构。结构体是值类型,适合用于表示轻量级的数据结构。通过实践练习,你可以更好地理解和掌握结构体的定义和使用。